/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package otcapp.utiles;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 *
 * @author diego
 */
public class UtilesFechas {

    /**
     * Formatos fecha
     */
    private static SimpleDateFormat format_dd_MM_yyyy = new SimpleDateFormat("dd/MM/yyyy");
    private static SimpleDateFormat formatMySQLyyyyMMdd = new SimpleDateFormat("yyyy-MM-dd");
    private static SimpleDateFormat format_yyyy_MM_dd = new SimpleDateFormat("yyyy/MM/dd");
    private static SimpleDateFormat formatDiaSemana = new SimpleDateFormat("EEEE");

    /**
     *
     * @param fecha
     * @return número del día en entero
     */
    public static int getDia(Date fecha) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(fecha);
        return calendar.get(Calendar.DAY_OF_MONTH);
    }

    /**
     *
     * @param fecha
     * @return regresa el nombre del día
     */
    public static String getDiaNombre(Date fecha) {
        return formatDiaSemana.format(fecha);
    }

    /**
     *
     * @param fecha
     * @return número del mes en entero
     */
    public static int getMes(Date fecha) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(fecha);
        return calendar.get(Calendar.MONTH);
    }

    /**
     *
     * @param fecha
     * @return número del año en entero
     */
    public static int getAnio(Date fecha) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(fecha);
        return calendar.get(Calendar.YEAR);
    }

    public static Date StringAFecha(String strFecha) throws ParseException {

        Date nuevaFecha = null;

        if (strFecha.split("-").length != 1) {//la fecha ingresada tiene separador "-"
            if (strFecha.split("-")[0].length() == 4) {//la fecha ingresada tiene formato yyyy-MM-dd
                nuevaFecha = formatMySQLyyyyMMdd.parse(strFecha);
            } else {//la fecha ingresada tiene formato dd-MM-yyyy
                nuevaFecha = format_dd_MM_yyyy.parse(strFecha);
            }
        } else if (strFecha.split("/").length != 1) {//la fecha ingresada tiene separador "/"
            if (strFecha.split("/")[0].length() == 4) {//la fecha ingresada tiene formatoo yyyy/MM/dd
                nuevaFecha = format_yyyy_MM_dd.parse(strFecha);
            } else {//la fecha ingresada tiene formato dd/MM/yyyy
                nuevaFecha = format_dd_MM_yyyy.parse(strFecha);
            }
        }

        return nuevaFecha;
    }

    /**
     *
     * @param fecha
     * @return fecha formateada "yyyy-MM-dd"
     */
    public static String formatearAMySql(Date fecha) {

        String fechaFormateada = formatMySQLyyyyMMdd.format(fecha);

        return fechaFormateada;

    }

    /**
     *
     * @param fecha
     * @return La fecha formateada a String con el formato "dd/MM/yyyy"
     */
    public static String formatearADiaMesAnio(Date fecha) {
        return format_dd_MM_yyyy.format(fecha);
    }

    /**
     *
     * @param fecha
     * @return La fecha formateada a String con el formato "yyyy/MM/dd"
     */
    public static String formatearAanioMesDia(Date fecha) {
        return format_yyyy_MM_dd.format(fecha);
    }

    /**
     * Compara 2 fechas ingresadas
     *
     * @return Regresa -1 si fecha1 es menor a fecha2. Regresa 1 si fecha1 es
     * mayor a fecha2. Regresa 0 si son iguales
     *
     *
     */
    public static int compararFechas(Date fecha1, Date fecha2) {

        Calendar calendarFecha1 = Calendar.getInstance();
        calendarFecha1.setTime(fecha1);
        calendarFecha1.set(Calendar.HOUR_OF_DAY, 0);
        calendarFecha1.set(Calendar.MINUTE, 0);
        calendarFecha1.set(Calendar.SECOND, 0);
        calendarFecha1.set(Calendar.MILLISECOND, 0);

        Calendar calendarFecha2 = Calendar.getInstance();
        calendarFecha2.setTime(fecha2);
        calendarFecha2.set(Calendar.HOUR_OF_DAY, 0);
        calendarFecha2.set(Calendar.MINUTE, 0);
        calendarFecha2.set(Calendar.SECOND, 0);
        calendarFecha2.set(Calendar.MILLISECOND, 0);

        return calendarFecha1.compareTo(calendarFecha2);

    }

    /**
     *
     * @param mesNumero
     * @return Regresa el nombre del mes ingresado
     */
    public static String getMesNombre(int mesNumero) {
        if (mesNumero == 1) {
            return "Enero";
        } else if (mesNumero == 2) {
            return "Febrero";
        } else if (mesNumero == 3) {
            return "Marzo";
        } else if (mesNumero == 4) {
            return "Abril";
        } else if (mesNumero == 5) {
            return "Mayo";
        } else if (mesNumero == 6) {
            return "Junio";
        } else if (mesNumero == 7) {
            return "Julio";
        } else if (mesNumero == 8) {
            return "Agosto";
        } else if (mesNumero == 9) {
            return "Septiembre";
        } else if (mesNumero == 10) {
            return "Octubre";
        } else if (mesNumero == 11) {
            return "Noviembre";
        } else if (mesNumero == 12) {
            return "Diciembre";
        } else {
            return "";
        }
    }

    /**
     * regresa la diferencia en días entre 2 fechas
     * @param fecha1
     * @param fecha2
     * @return 
     */
    public static int restarFechas(Date fecha1, Date fecha2) {
        long dif;
        GregorianCalendar cal1 = new GregorianCalendar();
        cal1.setTime(fecha1);
        GregorianCalendar cal2 = new GregorianCalendar();
        cal2.setTime(fecha2);
        
        dif = cal1.getTime().getTime() - cal2.getTime().getTime();
        
        
        if(dif<0){
            dif = dif*(-1);
        }
        
        long dias = (dif/86400000);//86400000 = 1000 milisegundos por 3600 segundos por 24 horas para la conversion
        int diasEnteros = (int)dias;
        return diasEnteros;
    }
}
